package network

import "fmt"

type ErrorType uint8

const (
	ErrorType_Underlying ErrorType = 1 // 底层net包传递出来的错误
	ErrorType_Network    ErrorType = 2 // 该网络包传递的错误
	ErrorType_Customer   ErrorType = 3 // OnMessage()内panic传递的值
)

// 网络包错误类型
// 方便处理网络包错误类型的判断
type Error interface {
	error

	// 返回错误类型ErrorType
	ErrorType() ErrorType

	// 返回错误源数据
	RawError() any
}

// 网络包错误 实现Error
type networkError struct {
	errorType ErrorType
	rawError  any
}

func (ne *networkError) ErrorType() ErrorType {
	return ne.errorType
}

func (ne *networkError) RawError() any {
	return ne.rawError
}

func (ne *networkError) Error() string {
	switch ne.errorType {
	case ErrorType_Underlying:
		return fmt.Sprintf("Underlying %v", ne.rawError)
	case ErrorType_Network:
		return fmt.Sprintf("Network %v", ne.rawError)
	case ErrorType_Customer:
		return fmt.Sprintf("Customer %v", ne.rawError)
	default:
		return fmt.Sprintf("%v", ne.rawError)
	}
}
